package com.yanjiali.config.jackson;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;
import java.util.TimeZone;

/**
 * @Package: com.yanjiali.com.yanjiali.config.jackson
 * @Author: yanjiali
 * @Created: 2024/6/15 9:50
 * TODO Spring Boot 的 Jackson JSON 处理库的配置类，主要用于自定义 ObjectMapper 的行为
 */
@Configuration
public class JacksonConfig {
    /**
     * 配置并返回一个自定义的ObjectMapper实例。
     * @return 自定义配置的ObjectMapper实例。
     */
    @Bean
    public ObjectMapper objectMapper() {
        // 创建一个新的ObjectMapper实例。
        ObjectMapper objectMapper = new ObjectMapper();

        // 注册JavaTimeModule模块以处理Java 8日期和时间API。
        objectMapper.registerModule(new JavaTimeModule());

        // 创建一个SimpleModule实例以添加自定义序列化器。
        SimpleModule simpleModule = new SimpleModule();
        // 将Long类型的序列化器设置为ToStringSerializer实例，以避免Long类型在前端丢失精度。
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        // 将自定义模块注册到ObjectMapper中。
        objectMapper.registerModule(simpleModule);

        // 设置时区为亚洲/上海。
        objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

        // 设置日期格式为"yyyy-MM-dd HH:mm:ss"。
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        // 设置属性的可见性为所有访问级别（公有、私有、保护、默认），包括字段和getter/setter方法。
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

        // 返回配置完成的ObjectMapper实例。
        return objectMapper;
    }
}
